#include <func.h>

int main()
{
    int sem_id=semget(1000,2,IPC_CREAT|0600);
    ERROR_CHECK(sem_id,-1,"semget");
    unsigned short a[2]={0,10};
    int ret=semctl(sem_id,0,SETALL,a);
    ERROR_CHECK(ret,-1,"semctl");
    if(!fork())//0是物品，1是空位
    {//消费者
        struct sembuf sopp,sopv;
        sopp.sem_num=0;
        sopp.sem_op=-1;
        sopp.sem_flg=SEM_UNDO;
        sopv.sem_num=1;
        sopv.sem_op=1;
        sopv.sem_flg=SEM_UNDO;
        while (1)
        {
            printf("我是消费者，现有物品%d,现有空位%d\n",semctl(sem_id,0,GETVAL),semctl(sem_id,1,GETVAL));
            semop(sem_id,&sopp,1);
            printf("消费\n");
            semop(sem_id,&sopv,1);
            sleep(2);
        }       
        return 0;
    }    
    else
    {//生产者
        struct sembuf sopp,sopv;
        sopp.sem_num=1;
        sopp.sem_op=-1;
        sopp.sem_flg=SEM_UNDO;
        sopv.sem_num=0;
        sopv.sem_op=1;
        sopv.sem_flg=SEM_UNDO;
        while (1)
        {
            printf("我是生产者，现有物品%d,现有空位%d\n",semctl(sem_id,0,GETVAL),semctl(sem_id,1,GETVAL));
            semop(sem_id,&sopp,1);
            printf("生产\n");
            semop(sem_id,&sopv,1);
            sleep(1);
        }       
        return 0;
    }
}